package com.wh.blockquene;

import java.util.ArrayList;
import java.util.Random;
/**
 * 
 *  Class Name: ProviderAndCustomerTest.java
 *  Description: 模拟阻塞队列，进行生产者消费者消化消息的模拟，两个对象持有一个队列
 *  @author wanghao  DateTime 2016年12月29日 上午11:49:47 
 *  @company hongbo
 *  @email 1228675455@qq.com
 */
public class ProviderAndCustomerTest {

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		Thread provider = new Thread(new MessageProvider(list, 10));
		Thread customer = new Thread(new MessageCustomer(list, 10));
		customer.start();
		provider.start();
	}
}

/**
 * 
 *  Class Name: ProviderAndCustomerTest.java
 *  Description: 模拟队列的生产者
 *  @author wanghao  DateTime 2016年12月29日 上午11:43:57 
 *  @company hongbo
 *  @email 1228675455@qq.com
 */
class MessageProvider implements Runnable {

	private ArrayList<Integer> list;
	private Integer maxLength;
	
	public MessageProvider(ArrayList<Integer> list, Integer maxLength) {
		super();
		this.list = list;
		this.maxLength = maxLength;
	}

	@Override
	public void run() {
		while(true) {
			synchronized (list) {
				//对于队列进行加锁操作
				//如果队列当中的元素已经满了,则等待消费者消费再进行插入
				if(list.size() == 10) {
					try {
						System.out.println("队列当中的内容已经满了,生产者进行等待");
						list.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					//模拟消息等待的过程
					Random random = new Random();
					Integer num = random.nextInt(10);
					list.add(num);
					System.out.println("生产者插入队列的数字:" + num);
					list.notify();//插入元素之后进行线程唤醒
				}
			}
		}
	}
	
}

/**
 * 
 *  Class Name: ProviderAndCustomerTest.java
 *  Description: 模拟队列的消费者
 *  @author wanghao  DateTime 2016年12月29日 上午11:44:18 
 *  @company hongbo
 *  @email 1228675455@qq.com
 */
class MessageCustomer implements Runnable {

	private ArrayList<Integer> list;
	private Integer maxLength;
	
	
	public MessageCustomer(ArrayList<Integer> list, Integer maxLength) {
		super();
		this.list = list;
		this.maxLength = maxLength;
	}


	@Override
	public void run() {
		//对于队列进行加锁操作
		//如果队列当前没有元素，则等待生产者插入之后再进行消毒
		while(true) {
			synchronized (list) {
				if(list.size() == 0) {
					try {
						System.out.println("消息队列当中没有数据，消费者进行等待");
						list.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					Integer num = list.remove(list.size() -1);
					System.out.println("消费者消费的数字是：" + num);
					list.notify();//唤醒生产者插入操作,即消费者消费了之后生产者可以插入
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	
}